package sample

import (
	"bufio"
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"os"
	"path/filepath"
)

// ExeSql 执行应用程序目录下的sql脚本，一般用于定时任务执行
func ExeSql() {
	// 获取脚本文件的绝对路径
	absPath, _ := filepath.Abs(os.Args[0])

	// 获取脚本文件所在目录的路径
	dir := filepath.Dir(absPath)

	//记录日志到文件
	logFileName := filepath.Join(dir, "exesql.log")
	logfile, err := os.OpenFile(logFileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	checkError(err)
	defer logfile.Close()
	log.SetOutput(logfile)

	// 获取目录下的所有 .sql 文件
	files, err := filepath.Glob(filepath.Join(dir, "*.sql"))
	checkError(err)

	// 遍历每个 .sql 文件并执行 SQL 语句
	for _, file := range files {
		log.Printf("正在处理文件：%s", file)
		execute(file)
		log.Println()
	}

	fmt.Println("任务执行完成，执行结果请查看日志：", logFileName)
}

func execute(path string) {
	// 打开包含连接信息和 SQL 语句的文件
	file, err := os.Open(path)
	checkError(err)
	defer file.Close()

	scanner := bufio.NewScanner(file)

	// 第一行为数据库连接信息
	if !scanner.Scan() {
		log.Fatal("无法读取连接信息")
	}
	connStr := scanner.Text()

	// 连接到数据库
	db, err := sql.Open("mysql", connStr)
	checkError(err)
	defer db.Close()

	// 剩余行为 SQL 语句
	var query string
	for scanner.Scan() {
		line := scanner.Text()
		query += line

		// 如果以分号结尾，则执行该语句
		if len(line) > 0 && line[len(line)-1:] == ";" {
			log.Println("执行SQL> ", query)
			_, err = db.Exec(query)
			checkError(err)

			// 清空 query 变量以准备下一个查询
			query = ""
		}
	}

	// 检查可能存在的最后一条不以分号结束的语句
	if query != "" {
		log.Println("执行SQL> ", query)
		_, err = db.Exec(query)
		checkError(err)
	}

	log.Printf("文件名：%v ，数据库：%v  ，以上 SQL 语句执行完成！", file.Name(), connStr)
}

func checkError(err error) {
	if err != nil {
		log.Fatal(err)
	}
}
